package pr2012.practico5.sort;

import java.util.Random;
import junit.framework.TestCase;

public class TestBasicoP5 extends TestCase {
        
        private static final int MAX_ELEMENTOS = 1000;
        
        private TClasificador clasificador;
        private int[] datosAOrdenar;
        
        public void setUp() {
                clasificador = new TClasificador();
                datosAOrdenar = generarDatosAleatorios(MAX_ELEMENTOS);
        }

        private int[] generarDatosAleatorios(int cantidadElementos) {
                Random rnd = new Random();
                int[] datosGenerados = new int[cantidadElementos];
                boolean[] datosUtilizados = new boolean[cantidadElementos];
                for (int i = 0; i < datosGenerados.length; i++) {
                        int j = rnd.nextInt(cantidadElementos);
                        while(datosUtilizados[j]){
                                j = (j + 1) % cantidadElementos;
                        }
                        datosGenerados[j] = i;
                        datosUtilizados[j] = true;
                }
                return datosGenerados;
        }
        
        private void validarOrdenado(int[] resultado, String nombreAlgoritmo) {
                assertNotNull("El resultado del algoritmo " + nombreAlgoritmo + " es nulo.", resultado);
                int resultadoAnterior = -1;
                for (int i = 0; i < resultado.length; i++) {
                        assertTrue("Error al validar el Algoritmo " + nombreAlgoritmo, resultado[i] > resultadoAnterior);
                        resultadoAnterior = resultado[i];
                }
        }

        private int[] ejecutarInsercionDirecta(int[] datos) {
                return clasificador.clasificar(datos, TClasificador.METODO_CLASIFICACION_INSERCION_DIRECTA);
        }

        private int[] ejecutarShellSort(int[] datos) {
                return clasificador.clasificar(datos, TClasificador.METODO_CLASIFICACION_SHELLSORT);
        }
        
        private int[] ejecutarBurbuja(int[] datos) {
                return clasificador.clasificar(datos, TClasificador.METODO_CLASIFICACION_BURBUJA);
        }

        private int[] ejecutarQuickSort(int[] datos) {
                return clasificador.clasificar(datos, TClasificador.METODO_CLASIFICACION_QUICKSORT);
        }

        private int[] ejecutarSeleccionDirecta(int[] datos) {
                return clasificador.clasificar(datos, TClasificador.METODO_CLASIFICACION_SELECCION_DIRECTA);
        }

        private int[] ejecutarHeapSort(int[] datos) {
                return clasificador.clasificar(datos, TClasificador.METODO_CLASIFICACION_HEAPSORT);
        }
        
        public void testInsercionDirecta(){
                int[] resultado = ejecutarInsercionDirecta(datosAOrdenar);
                validarOrdenado(resultado,"Insercion Directa");
        }

        public void testShellSort(){
                int[] resultado = ejecutarShellSort(datosAOrdenar);
                validarOrdenado(resultado,"ShellSort");
        }
        
        public void testBurbuja(){
                int[] resultado = ejecutarBurbuja(datosAOrdenar);
                validarOrdenado(resultado,"Burbuja");
        }
        
        public void testQuickSort(){
                int[] resultado = ejecutarQuickSort(datosAOrdenar);
                validarOrdenado(resultado,"QuickSort");
        }
        
        public void testSeleccionDirecta(){
                int[] resultado = ejecutarSeleccionDirecta(datosAOrdenar);
                validarOrdenado(resultado,"Seleccion Directa");
        }

        public void testHeapSort(){
                int[] resultado = ejecutarHeapSort(datosAOrdenar);
                validarOrdenado(resultado, "HeapSort");
        }
}
